#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <inttypes.h>
#include <time.h>
#include <genrand.h>
#include <hexstr.h>
#include <logbase.h>

// check time
void chkTimeFunc()
{
    // 1970到现在的时间戳。
    time_t tmptime = time(NULL);
    struct tm *tmpLocalTime = localtime(&tmptime);
    logdebugc("time func val:%ld", tmptime);
    logdebugc("time to local time,year=%d,month=%d,day=%d,hour=%d,min=%d,sec=%d,weekday=%d",
             tmpLocalTime->tm_year + 1900 /*tmpLocalTime->tm_yday需要加1900才行*/,
             tmpLocalTime->tm_mon + 1, // 月+1
             tmpLocalTime->tm_mday, tmpLocalTime->tm_hour,
             tmpLocalTime->tm_min, tmpLocalTime->tm_sec, tmpLocalTime->tm_wday);
    // 转回去。
    tmptime = mktime(tmpLocalTime);
    logdebugc("local time to stamp:%ld", tmptime);
}

// check gettimeofday
void chkGettimeofdayFunc()
{
    // struct timeval
    // {
    // __time_t tv_sec;		/* Seconds.  */
    // __suseconds_t tv_usec;	/* Microseconds.  */
    // };
    struct timeval tmpdaytime;
    gettimeofday(&tmpdaytime, NULL);
    // 1970到现在的时间戳。
    struct tm *tmpLocalTime = localtime(&tmpdaytime.tv_sec);
    logdebugc("gettimeofday func val:%ld", tmpdaytime.tv_sec);
    logdebugc("gettimeofday to local time,year=%d,month=%d,day=%d,hour=%d,min=%d,sec=%d,weekday=%d",
             tmpLocalTime->tm_year + 1900 /*tmpLocalTime->tm_yday需要加1900才行*/,
             tmpLocalTime->tm_mon + 1, // 月+1
             tmpLocalTime->tm_mday, tmpLocalTime->tm_hour,
             tmpLocalTime->tm_min, tmpLocalTime->tm_sec, tmpLocalTime->tm_wday);
    // 转回去。
    tmpdaytime.tv_sec = mktime(tmpLocalTime);
    logdebugc("local time to stamp:%ld", tmpdaytime.tv_sec);
    int tmpflag = settimeofday(&tmpdaytime, NULL);// pc不能用
    logdebugc("set time flag = %d", tmpflag);
    /*
    hwclock: invalid option -- h
    BusyBox v1.27.2 (2024-08-12 09:33:59 CST) multi-call binary.
    Usage: hwclock [-r|--show]显示 [-s|--hctosys]硬件到系统 [-w|--systohc]系统到硬件 [-t|--systz] [-l|--localtime] [-u|--utc] [-f|--rtc FILE]
    下面是参考：
    */
    system("/sbin/hwclock -w -f /dev/rtc");// pc不能用
}

// 如果其他地方修改了系统时间，我们gettimeofday也会改变。如果用gettimeofday或time函数来做运行时序控制会有问题。
// 比如我用gettimeofday获得起始时间，要查看某个函数要花费多少时间。如果这个函数运行过程中，时间改变了，会导致计算时间不准确。
// 获取系统运行时间。系统启动时间不受settimeofday的影响。
// check clock_gettime
void chkClockgettimeFunc()
{
    struct timespec tnow;
    clock_gettime(CLOCK_MONOTONIC, &tnow);
    logdebugc("sys up time = %ld.%ld", tnow.tv_sec, tnow.tv_nsec);
}

int main(int argsize, const char **args)
{
    chkTimeFunc();
    chkGettimeofdayFunc();
    chkClockgettimeFunc();
    return 0;
}